215. 数组中的第K个最大元素
30min
拿到题首先想到的当然是直接排序…才怪
但是我们可以优化快速排序来得到结果
解法 1.快速排序
快速排序的思路是从数组中找到一个基准,将数组分为基准,比基准小的部分,比基准大的部分。
而基准本身已经排序完毕,如基准就是第k大元素,则可直接得到结果。
如基准的位置在k左边,则在比基准大的部分中继续找
如基准在k的右边,则在比基准小的部分继续找
需要注意的有三个点
- 怎么选择基准
Math.floor(Math.random() * (r - l + 1) + l)
- 排序时的区间开闭
- 排序后基准记得归位
1 | function swap(a,i,j) { |
解法2. 最大堆
既然是要取第k大的,可以将最大堆最大值取k 次,最后一次就是要的结果
这里难度在我们实现一个最大堆,需要注意的点有
- 边界条件,比如shiftUp 时 k最小取到0,shiftDown时的结束条件是没有左子节点。
- shiftDown 时需要判断右子节点是否存在
1 | function swap(a,i,j) { |